Use case: DMA2D transfer polling mode

Sequence diagram

DMA2D transfer polling mode.

@startuml
== DMA2D Initialization and Configuration ==
"Application" -> "DMA2D Driver" : HAL_DMA2D_Init()
"DMA2D Driver" --> "Application" : HAL_OK or HAL_INVALID_PARAM
"Application" -> "DMA2D Driver" : HAL_DMA2D_ConfigLayer()
"DMA2D Driver" --> "Application" :
== DMA2D Transfer Process ==
"Application" -> "DMA2D Driver" : HAL_DMA2D_Start()
"DMA2D Driver" --> "Application" :
"Application" -> "DMA2D Driver" : HAL_DMA2D_PollForTransfer()
"DMA2D Driver" --> "Application" :

@enduml

Code snippet

HAL1

HAL2

const uint32_t ARGB8888_Tab[256] = { .
                                     .
                                     .
                                     0xEFFFFFF2, 0xAB1FFFF0,
                                     0x0504044E, 0x89ADCDEF,
                                     0x15248722, 0x5201245E,
                                     0x01025FDE, 0xFE010203,
                                     0xEFFFFFF2, 0xAB1FFFF0,
                                     0x0504044E, 0x89ADCDEF,
                                     0x15248722, 0x5201245E,
                                     0x01025FDE, 0xFE010203};
uint32_t ARGB8888_result[1024];

DMA2D_HandleTypeDef hdma2d;





/* DMA2D init configuration */
hdma2d.Instance = DMA2D;

hdma2d.Init.Mode = DMA2D_M2M;
hdma2d.Init.ColorMode = DMA2D_OUTPUT_ARGB8888;
hdma2d.Init.RedBlueSwap = DMA2D_RB_REGULAR;
hdma2d.Init.OutputOffset = 0x0;
hdma2d.Init.LineOffsetMode = DMA2D_LOM_BYTES;
hdma2d.Init.AlphaInverted = DMA2D_INVERTED_ALPHA;
hdma2d.Init.BytesSwap = DMA2D_BYTES_SWAP;

/* DMA2D layer configuration */

hdma2d.LayerCfg[DMA2D_FOREGROUND_LAYER].InputColorMode = DMA2D_INPUT_ARGB8888;
hdma2d.LayerCfg[DMA2D_FOREGROUND_LAYER].RedBlueSwap = DMA2D_RB_REGULAR;
hdma2d.LayerCfg[DMA2D_FOREGROUND_LAYER].InputOffset = 0;
hdma2d.LayerCfg[DMA2D_FOREGROUND_LAYER].AlphaMode = DMA2D_REPLACE_ALPHA;
hdma2d.LayerCfg[DMA2D_FOREGROUND_LAYER].InputAlpha = 0xFF;
hdma2d.LayerCfg[DMA2D_FOREGROUND_LAYER].AlphaInverted = DMA2D_INVERTED_ALPHA;




HAL_DMA2D_Init(&hdma2d);



HAL_DMA2D_ConfigLayer(&hdma2d, DMA2D_FOREGROUND_LAYER);
HAL_DMA2D_Start(&hdma2d, (uint32_t)&ARGB8888_Tab,
                (uint32_t)&ARGB8888_result, 16, 16);
HAL_DMA2D_PollForTransfer(&hdma2d, 10);
const uint32_t ARGB8888_Tab[256] = { .
                                     .
                                     .
                                     0xEFFFFFF2, 0xAB1FFFF0,
                                     0x0504044E, 0x89ADCDEF,
                                     0x15248722, 0x5201245E,
                                     0x01025FDE, 0xFE010203,
                                     0xEFFFFFF2, 0xAB1FFFF0,
                                     0x0504044E, 0x89ADCDEF,
                                     0x15248722, 0x5201245E,
                                     0x01025FDE, 0xFE010203};
uint32_t ARGB8888_result[1024];

hal_dma2d_handle_t hdma2d;

/* DMA2D initialization */

HAL_DMA2D_Init(&hdma2d, HAL_DMA2D);

/* DMA2D output configuration */

p_config.output.p_dest = (void *)&ARGB8888_result;

p_config.output.color_mode = HAL_DMA2D_OUTPUT_COLOR_ARGB8888;

p_config.output.offset = 0x0;




/* DMA2D input configuration */
p_config.input.p_src = (void const*) (uint32_t)&ARGB8888_Tab;
p_config.input.color_mode = HAL_DMA2D_INPUT_COLOR_ARGB8888;

p_config.input.offset = 0;
p_config.input.alpha_mode = HAL_DMA2D_INPUT_ALPHA_REPLACE;
p_config.input.alpha_value = 0xFF;


p_config.width = 16;
p_config.height = 16;


HAL_DMA2D_EnableOutputAlphaInversion(&hdma2d);
HAL_DMA2D_EnableOutputByteSwap(&hdma2d);
HAL_DMA2D_EnableInputAlphaInversion(&hdma2d);
HAL_DMA2D_SetConfigMemCopy(&hdma2d, &p_config);
HAL_DMA2D_Start(&hdma2d);
HAL_DMA2D_PollForTransfer(&hdma2d, 10);

Key changes

  1. In HAL2, the source, destination, and size are configured using a dedicated configuration function (for example, HAL_DMA2D_SetConfigMemCopy()) before calling HAL_DMA2D_Start().

  2. HAL2 introduces unitary APIs to enable specific features (for example, alpha inversion and byte swap).